package com.xwtec.observer.v6;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: zt
 * @Date: 2021/2/28 21:13
 * 分离观察者与被观察者
 * 小孩可能早上哭，晚上哭，床上哭，床下哭，观察者实际上根据小孩哭的情况做出实际贩判断，所以要把事件单独剥离成一个对象
 */
public class Main {
    public static void main(String[] args) {
      Child child = new Child();
        child.wakeUp();
    }
}

class Child{
    boolean cry = false;
    private List<Observer> observers = new ArrayList<Observer>();
    {
        observers.add(new Dad());
        observers.add(new Mum());
        observers.add(new Dog());
    }

    public void wakeUp(){
        cry = true;
        Event event = new Event(System.currentTimeMillis(), "地板上");
        for (Observer o:observers) {
            o.actionWakeUp(event);
        }
    }

}

//观察者接口，方法是所有的观察者都要实现小孩醒的动作
//此时的需要把事件当作参数传递进去
interface Observer{
    void actionWakeUp(Event e);
}

// 事件
class Event{
    //时间
    long timeStamp;
    //地点
    String loc;

    public Event(long timeStamp, String loc) {
        this.timeStamp = timeStamp;
        this.loc = loc;
    }
}

/**
 * 父亲作为观察者
 */
class Dad implements Observer {

    //观察者执行的方法
    public void feed(){
        System.out.println("Dad,feeding............");
    }

    @Override
    public void actionWakeUp(Event e) {
        feed();
    }
}

/**
 * 母亲作为观察者
 */
class Mum implements Observer {

    //观察者执行的方法
    public void hug(){
        System.out.println("Mum,hugging............");
    }

    @Override
    public void actionWakeUp(Event e) {
        hug();
    }
}

/**
 * 狗作为观察者
 */
class Dog implements Observer {

    //观察者执行的方法
    public void wang(){
        System.out.println("Dog,wang............");
    }

    @Override
    public void actionWakeUp(Event e) {
        wang();
    }
}
